package com.cmc.cloud.cmclink.doc.service.so;

import com.cmc.cloud.cmclink.doc.entity.SoDO;
import com.cmc.cloud.cmclink.doc.vo.manifestvo.manifest.ManifestSoPageReqVO;
import com.cmc.cloud.cmclink.doc.vo.sovo.sovo.*;
import com.cmc.cloud.cmclink.doc.vo.sovo.sovslvoyvo.SoVslvoyUpdateReqVO;
import com.cmes.framework.common.pojo.PageResult;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 订舱 Service 接口
 *
 * @author 招商轮船-管理员
 */
public interface SoService {

    /**
     * 创建订舱
     *
     * @param createReqVO 创建信息
     * @return 订舱
     */
    SoDO createSo(@Valid SoCreateReqVO createReqVO);

    /**
     * 创建或更新订舱
     *
     * @param createReqVO 创建信息
     * @return 订舱
     */
    SoDO createOrUpdateSo(SoUpdateReqVO createReqVO);

    /**
     * 更新订舱
     *
     * @param updateReqVO 更新信息
     */
    void updateSo(@Valid SoUpdateReqVO updateReqVO);

    /**
     * 更新订舱
     *
     * @param updateObj 更新信息
     */
    void updateById(SoDO updateObj);

    /**
     * 删除订舱
     *
     * @param id 编号
     */
    void deleteSo(Long id);

    /**
     * 获得订舱
     *
     * @param id 编号
     * @return 订舱
     */
    SoDO getSo(Long id);

    /**
     * 查询上一个，下一个
     *
     * @param id   编号
     * @param type 类型
     * @return 订舱
     */
    Long findPreviousOrNext(Long id, String type);

    /**
     * 获得订舱列表
     *
     * @param ids 编号
     * @return 订舱列表
     */
    List<SoDO> getSoList(Collection<Long> ids);

    /**
     * 通过提单号列表 获得订舱列表
     *
     * @param blNos 提单号列表
     * @return 订舱列表
     */
    List<SoDO> getSoListByBlNos(List<String> blNos);

    /**
     * 获得订舱分页
     *
     * @param pageReqVO 分页查询
     * @return 订舱分页
     */
    PageResult<SoDO> getSoPage(SoPageReqVO pageReqVO);

    /**
     * 获得订舱分页
     *
     * @param reqVO 分页查询
     * @return 订舱分页
     */
    PageResult<SoRespVO> getSoPageAmend(SoPageReqVO reqVO);

    /**
     * 获得订舱分页
     *
     * @param reqVO 分页查询
     * @return 订舱分页
     */
    PageResult<SoRespVO> getSoManifest(ManifestSoPageReqVO reqVO);


    /**
     * 通过订舱Ids 删除
     *
     * @param soIds  订舱Ids
     * @param userId 当前用户id
     */
    void deleteBySoIds(Collection<Long> soIds, String userId);

    /**
     * 检查是否是草稿状态
     *
     * @param ids      订舱Ids
     * @param soStatus 状态
     * @param userId   当前用户id
     * @return 订舱列表
     */
    List<SoDO> checkSoStatusByUserId(Collection<Long> ids, List<String> soStatus, String userId);

    /**
     * 检查是否是草稿状态
     *
     * @param ids      订舱Ids
     * @param soStatus 状态
     * @param userId   当前用户id
     * @param errorMsg 错误提示
     * @return 订舱列表
     */
    List<SoDO> checkSoStatusByUserId(Collection<Long> ids, List<String> soStatus, String userId, String errorMsg);

    /**
     * 批量跟新更新状态
     *
     * @param solist 订舱Ids
     */
    void updateBatch(Collection<SoDO> solist);

    /**
     * 批量更新为草稿
     *
     * @param ids 订舱Ids
     */
    void batchReturnToDraft(Collection<Long> ids);

    /**
     * 设置为默认状态
     *
     * @param so 订舱
     */
    void setDefaultDraftValue(SoDO so);


    /**
     * 根据订舱号或提单号查询订舱
     *
     * @param req 查询订舱数据
     * @return 订舱
     */
    Long getByBookingNoOrBlNo(SoQueryReqVO req);
    /**
     * 根据订舱号或提单号查询订舱
     *
     * @param req 查询订舱数据
     * @return SoDO 订舱主表信息
     */
    public SoDO getSoDoByBookingNoOrBlNo(SoQueryReqVO req) ;

    /**
     * 根据订舱号或提单号查询订舱
     *
     * @param req 查询订舱数据
     * @return 订舱
     */
    SoDO ediGetByBookingNoOrBlNo(SoQueryReqVO req);

    /**
     * 查询订舱补充已提交
     *
     * @param id 订舱
     */
    void setCustomerUploadedMaterial(Long id);

    /**
     * 设置为默认状态
     *
     * @param id              订舱
     * @param soStatus        订舱状态
     * @param soContentStatus 内容状态
     */
    void updateStatusAndContentStatus(Long id, String soStatus, String soContentStatus);

    /**
     * 设置有效状态
     *
     * @param id          订舱
     * @param validStatus 有效状态
     */
    void updateValidStatus(List<Long> id, Integer validStatus);

    /**
     * 查询列表
     *
     * @param reqVO 查询
     * @return SoDO 订舱主表信息
     */
    List<SoDO> queryList(SoListReqVO reqVO);

    /**
     * SI 修改航线数据后同步
     *
     * @param bookingNo 查询
     * @return voyageInfo 航线数据
     */
    void updateVoyageInfo(String bookingNo, List<SoVslvoyUpdateReqVO> voyageInfo);

}
